package cn.doitedu.javase.socket.demo2;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author: 深似海
 * @Site: <a href="www.51doit.com">多易教育</a>
 * @QQ: 657270652
 * @Date: 2024/2/4
 * @Desc: 学大数据，上多易教育
 * <p>
 * 协议：
 * 发送的数据 是字符串
 * 客户端的请求：  111请求体222
 * 服务端的响应：  333响应体444
 * <p>
 * 认证：
 * 客户端先发：  111天王盖地虎222
 * 服务端回应：  333宝塔镇河妖444
 **/
public class Server {

    public static void main(String[] args) throws IOException {

        // 向操作系统注册绑定一个通信端口
        ServerSocket serverSocket = new ServerSocket(9088);

        while (true) {
            // 等待客户端的请求
            Socket socket = serverSocket.accept();
            // 从连接上获取输入、输出流用来收发数据
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();

            // 把输入输出包装成字符流
            InputStreamReader ir = new InputStreamReader(is);
            OutputStreamWriter iw = new OutputStreamWriter(os);

            // 用来接收客户端验证信息： "111天王盖地虎222"
            char[] headChar = new char[11];

            int read = ir.read(headChar);
            // 验证
            if (read == 11 && new String(headChar).equals("111天王盖地虎222")) {
                // 回复 333宝塔镇河妖444
                iw.write("333宝塔镇河妖444");
                iw.flush();
            } else {
                iw.write("333你不是我的菜444");
                iw.flush();
                // 把连接关闭
                ir.close();
                iw.close();
                socket.close();
            }

            // 开始接收真正的信息(循环不断，直到客户端关闭为止）
            char[] singleChar = new char[1];
            int head = 0;

            char[] contentChar = new char[1024];
            int idx = 0;

            while ((read = ir.read(singleChar)) != -1) {

                if(singleChar[0] != '1'  && head<3){
                    iw.write("333你的信息不合法444");
                    iw.flush();
                    // 把连接关闭
                    ir.close();
                    iw.close();
                    socket.close();
                    break;
                }else{
                    head++;
                }

                // 到了这，说明信息的111头已经过完
                int tail = 0;
                if(singleChar[0] != '2' ){
                    contentChar[idx] = singleChar[0];
                    idx++;
                }{
                    tail ++;
                    if(tail == 3){
                        // 说明请求的尾部标记收完了
                        // 处理收到的数据
                        System.out.println(new String(contentChar,0,idx));
                        idx = 0;

                        // 给客户端响应处理结果
                        iw.write("333服务端的响应444");
                        iw.flush();
                    }
                }
            }
        }
    }
}
